﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ComunesMGI.DataTypes;
using ComunesMGI.Enum;
using MGI.AccesoDatos;
using ComunesMGI.Constantes;

namespace MGI.Logica
{
    class MgrIncidentes
    {

        #region Singleton

        /// <summary>
        /// implementación de singleton para el manejador de incidentes
        /// </summary>
        static private MgrIncidentes _instance;

        /// <summary>
        /// implementación de singleton para el manejador de incidentes
        /// retorna una instancia del manejador
        /// </summary>
        /// <returns>MgrIncidentes</returns>
        static public MgrIncidentes getInstance()
        {
            if (_instance == null)
            {
                _instance = new MgrIncidentes();
            }
            return _instance;
        }

        #endregion


        public List<DataCampo> getCampos(DataCliente cliente, DataSistema sistema)
        {
            AccesoDatosFactory accesoDatos = AccesoDatosFactory.getInstance();
            IDatosIncidentes datosIncidentes = accesoDatos.getIDatosIncidentes();

            List<DataCampo> nomCampos = datosIncidentes.getCampos( cliente, sistema, Lista.Incidentes );

            ISharepoint sharepoint = accesoDatos.getISharepoint();

            return sharepoint.getCampos( cliente, sistema, Lista.Incidentes, nomCampos);
            
        }

        public DataAltaIncidente addIncidente(DataSistema incidente, List<DataAttachment> archivos)
        {
            AccesoDatosFactory accesoDatos = AccesoDatosFactory.getInstance();
            ISharepoint sharepoint = accesoDatos.getISharepoint();
            return sharepoint.addIncidente(incidente, archivos);
        }

        
        public List<DataIncidente> getIncidentes(DataCliente cliente, DataSistema sistema)
        {
            AccesoDatosFactory accesoDatos = AccesoDatosFactory.getInstance();
            ISharepoint sharepoint = accesoDatos.getISharepoint();
            return sharepoint.getIncidentes(sistema);
        }

        public List<DataTarea> getTareas(DataCliente cliente, DataSistema sistema, DataIncidente incidente)
        {
            AccesoDatosFactory accesoDatos = AccesoDatosFactory.getInstance();
            ISharepoint sharepoint = accesoDatos.getISharepoint();
            return sharepoint.getTareas(cliente, sistema, incidente);
        }

        public string asignarResponsable(DataSistema sistema, DataIncidente incidente, DataTarea tarea, DataUsuario usuario)
        {
            AccesoDatosFactory accesoDatos = AccesoDatosFactory.getInstance();
            ISharepoint sharepoint = accesoDatos.getISharepoint();
            string mail = sharepoint.asignarResponsable(sistema, incidente, tarea, usuario);
            return mail;
        }

        public bool addWorkPackage(DataCliente cliente, DataSistema sistema, DataWP workPackage)
        {
            AccesoDatosFactory accesoDatos = AccesoDatosFactory.getInstance();
            IDatosWorkPackages datosWP = accesoDatos.getIDatosWorkPackages();
            IDatosClientes datosCliente = accesoDatos.getIDatosClientes();
            cliente.Codigo = datosCliente.getCodigoCliente(cliente);
            IDatosSistemas datosSistemas = accesoDatos.getIDatosSistemas();
            sistema.Codigo = datosSistemas.getCodigoSistema(cliente, sistema);
            return datosWP.addWorkPackage(sistema, workPackage);
        }

        public List<DataWP> getWorkPackages(DataCliente cliente, DataSistema sistema)
        {
            AccesoDatosFactory accesoDatos = AccesoDatosFactory.getInstance();
            IDatosWorkPackages datosWP = accesoDatos.getIDatosWorkPackages();
            IDatosClientes datosCliente = accesoDatos.getIDatosClientes();
            cliente.Codigo = datosCliente.getCodigoCliente(cliente);
            IDatosSistemas datosSistemas = accesoDatos.getIDatosSistemas();
            sistema.Codigo = datosSistemas.getCodigoSistema(cliente, sistema);
            return datosWP.getWorkPackages(sistema);
        }

        public void asociarIncidenteWP(DataCliente cliente, DataSistema sistema, DataWP workPackage, List<DataIncidente> incidentes) 
        {
            AccesoDatosFactory accesoDatos = AccesoDatosFactory.getInstance();
            ISharepoint sharepoint = accesoDatos.getISharepoint();

            foreach (DataIncidente dataIncidente in incidentes) {
                sharepoint.setIncidenteWP(cliente, sistema, workPackage, dataIncidente);
            }
        }

        public List<DataIncidenteReporte> getIncidentesCerradosPeriodo(List<DataSistema> sistemas, DateTime perFchIni, DateTime perFchFin)
        {
            AccesoDatosFactory accesoDatos = AccesoDatosFactory.getInstance();
            IDatosIncidentes datosIncidentes = accesoDatos.getIDatosIncidentes();
            ISharepoint sharepoint = accesoDatos.getISharepoint();
            List<DataIncidenteReporte> incidentes = new List<DataIncidenteReporte>();
            List<DataIncidenteReporte> incidentesSistema;
            foreach (DataSistema dataSistema in sistemas)
            {
                incidentesSistema = sharepoint.getIncidentesReporte(dataSistema);
                foreach (DataIncidenteReporte incidenteAnalizado in incidentesSistema)
                {
                    //incidenteAnalizado.FechaCierre = DateTime.Today;
                    if (incidenteAnalizado.FechaCierre != ConstantesMGI.FechaVacia)
                    {
                        if (incidenteAnalizado.FechaCierre.CompareTo(perFchFin) <= 0 &&
                            incidenteAnalizado.FechaCierre.CompareTo(perFchIni) >= 0) 
                        {
                            incidentes.Add(incidenteAnalizado);                
                        }
                    }
                }
                
            }
            return incidentes;
        }

        public List<DataIncidente> getIncidentesWP(DataSistema sistema, DataWP workPackage)
        {
            AccesoDatosFactory accesoDatos = AccesoDatosFactory.getInstance();
            IDatosIncidentes datosIncidentes = accesoDatos.getIDatosIncidentes();
            ISharepoint sharepoint = accesoDatos.getISharepoint();
            return sharepoint.getIncidentesWP(sistema, workPackage);
        }

        public bool adjuntarArchivoIncidente(string nombreArchivo, DataSistema sistema, DataIncidente incidente, string nroTemp)
        {
            AccesoDatosFactory accesoDatos = AccesoDatosFactory.getInstance();
            IDatosIncidentes datosIncidentes = accesoDatos.getIDatosIncidentes();
            ISharepoint sharepoint = accesoDatos.getISharepoint();
            return sharepoint.adjuntarArchivoIncidente(nombreArchivo, sistema, incidente, nroTemp);
        }
    }
}
